package com.zzx.service.imp;

import com.zzx.Util.RandomUtil;
import com.zzx.Util.SMSUtil;
import com.zzx.bean.Express;
import com.zzx.dao.BaseExpressDao;
import com.zzx.dao.imql.ExpressDaoImp;
import com.zzx.exception.DuplicateCodeException;
import com.zzx.service.BaseExpressService;

import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * @Author: Spider Man
 * @Description:
 * @Date Created in 2020-09-13 15:21
 * @Modified By:
 */
public class ExpressService implements BaseExpressService {

    private BaseExpressDao expressDao = new ExpressDaoImp();

    /**
     * 用于查询数据库中的全部快递（总数+新增），代取件快递（总数+新增）
     *
     * @return [{size:总数,day:新增},{size:总数,day:新增}]
     */
    @Override
    public List<Map<String, Integer>> console() {
        return expressDao.console();
    }

    /**
     * 用于查询所有快递的信息
     *
     * @param limit      是否分页的标记，true表示要分页，false表示不用分页
     * @param offset     SQL语句的起始索引
     * @param pageNumber 页查询的数量
     * @return 快递对象的集合
     */
    @Override
    public List<Express> findAllExpressInfo(boolean limit, int offset, int pageNumber) {
        return expressDao.findAllExpressInfo(limit,offset,pageNumber);
    }

    /**
     * 根据快递单号查询快递信息
     *
     * @param number 快递单号
     * @return 查询的快递信息，单号不存在时返回null
     */
    @Override
    public Express findExpressByNumber(String number) {
        return expressDao.findExpressByNumber(number);
    }

    /**
     * 根据取件码查询快递信息
     *
     * @param code 取件码
     * @return 查询的快递信息，取件码不存在时返回null
     */
    @Override
    public Express findExpressByCode(String code) {
        return expressDao.findExpressByCode(code);
    }

    /**
     * 根据用户手机号码查询快递信息
     *
     * @param userPhone 用户手机号码
     * @return 查询的快递信息，用户手机号码不存在时返回null
     */
    @Override
    public List<Express> findExpressByUserPhone(String userPhone) {
        return expressDao.findExpressByUserPhone(userPhone);
    }

    /**
     * 根据用户手机号码和快递的状态码查询快递信息
     *
     * @param userPhone 用户手机号码
     * @param status 快递状态
     * @return 查询的快递信息，用户手机号码不存在时返回null
     */
    @Override
    public List<Express> findExpressByUserPhoneAndStatus(String userPhone, int status) {
        return expressDao.findExpressByUserPhoneAndStatus(userPhone,status);
    }

    /**
     * 根据录入人手机号码查询快递信息
     *
     * @param sysPhone 录入人手机号码
     * @return 查询的快递信息，录入人手机号码不存在时返回null
     */
    @Override
    public List<Express> findExpressBySysPhone(String sysPhone) {
        return expressDao.findExpressBySysPhone(sysPhone);
    }

    /**
     * 快递的录入
     *
     * @param express 快递对象
     * @return ture表示录入成功，false表示失败
     */
    @Override
    public boolean insert(Express express){
        express.setCode(RandomUtil.createCode()+"");
        try {
            boolean flag = expressDao.insert(express);
            if (flag){
                SMSUtil.send(express.getUserPhone(), express.getCode());
            }
            return flag;
        } catch (DuplicateCodeException e) {
            return false;
        }
    }

    /**
     * 快递的修改
     *
     * @param id      快递的ID
     * @param express 新的快递对象
     * @return ture表示更新成功，false表示更新失败
     */
    @Override
    public boolean update(int id, Express express) {
        if (express.getUserPhone() != null){
            expressDao.delete(id);
            return insert(express);
        }else {
            boolean update = expressDao.update(id, express);
            Express expressByNumber = expressDao.findExpressByNumber(express.getNumber());
            if (express.getStatus() == 1){
                updateStatus(expressByNumber.getCode());
            }
            return update;
        }
    }

    /**
     * 更加ID删除快递信息
     *
     * @param id 要删除的快递ID
     * @return true表示成功，false表示删除失败
     */
    @Override
    public boolean delete(int id) {
        return expressDao.delete(id);
    }

    /**
     * 更改快递的状态
     *
     * @param code 快递单号
     * @return true表示成功，false表示失败
     */
    @Override
    public boolean updateStatus(String code) {
        return expressDao.updateStatus(code);
    }
}
